// 实现apply
// apply只有两个参数，一个是this的指向，一个是参数列表

function person(a, b, c, d) {
  console.log(this.name);
  console.log(a, b, c, d);
}

var student = {
  name: 'Xmo'
};
const _this = this;
Function.prototype.newApply = function (obj, arr) {
  // 创建一个对象，来执行自己
  var obj = obj || _this;
  obj.p = this;
  var result;
  if (!arr) {
    result = obj.p();
  }
  else {
    var newArguments = [];
  // 获取所有参数
    for (let i = 0; i < arr.length; i++) {
      newArguments.push('arr[' + i + ']');
    }
    // 将参数放入函数中
    result = eval('obj.p(' + newArguments + ')');
  }
  delete obj.p;
  return result;
}

person.newApply(student, ['China', 'America', 'Japan', 'India']);